#include "SdlJeu.h"


void tilesetInit(const char * level, Terrain * pTer, TilesetStruct * pTile)
{
    FILE* F;
    char buf[CACHE_SIZE];
	F = fopen(level,"r"); /* ouvre le niveau choisit avec const char level*/
	if (!F)
		printf("fichier level introuvable\n");/* le niveau n'existe pas*/
	fgets(buf,CACHE_SIZE,F);

	do
	{
		fscanf(F,"%s",buf);
		if (strstr(buf,"#tileset"))
			chargerTilesetSDL(F,pTer,pTile);
	} while (strstr(buf,"#fin")==NULL);
	fclose(F);

}


SDL_Surface* LoadImage32(const char* fichier_image)
{
    SDL_Surface* image_finale;
    SDL_Surface* image_ram= SDL_LoadBMP(fichier_image);/*	 charge l'image dans image_ram en RAM*/

	if (image_ram==NULL)
	{
		printf("Image %s introuvable !! \n",fichier_image);
		SDL_Quit();
		system("pause");
		exit(-1);
	}
    image_finale = SDL_DisplayFormat(image_ram);
	SDL_FreeSurface(image_ram);
    return image_finale;
}


int AfficherSprite(Sprite* pSprite,SDL_Surface* screen)
{

	SDL_Surface * mario = NULL;
	SDL_Rect R;
	mario=LoadImage32("data/mario.bmp");
	R.x = pSprite->pPer->posX - pSprite->pTer->xscroll;
	R.y = pSprite->pPer->posY;
	R.w = pSprite->pPer->w;
	R.h = pSprite->pPer->h;
	SDL_BlitSurface(mario,NULL,screen,&R);
    SDL_FreeSurface(mario);
	return 0;
}


int AfficherMapSDL(Terrain* pTer,SDL_Surface* screen, Sprite * pSprite, TilesetStruct * pTile)
{
	int i,j;
	SDL_Rect Rect_dest;
	int numero_tile;
	int minx,maxx,miny,maxy;
	UpdateScroll(pTer, pSprite);
	minx = pTer->xscroll / pTer->LARGEUR_TILE-1;
	miny = -1;
	maxx = (pTer->xscroll + pTer->largeur_fenetre)/pTer->LARGEUR_TILE;
	maxy = pTer->hauteur_fenetre/pTer->HAUTEUR_TILE;/* prend les dimensions de la fenetre*/

	for(i=minx;i<=maxx;i++)
	{
		for(j=miny;j<=maxy;j++)
		{
			Rect_dest.x = (i*pTer->LARGEUR_TILE - pTer->xscroll);
			Rect_dest.y = (j*pTer->HAUTEUR_TILE);
			if (i<0 || j<0 || j>=pTer->nbtiles_hauteur_monde)
				numero_tile = 0;
			else
				numero_tile = pTer->schema[i%pTer->nbtiles_largeur_monde][j];
			SDL_BlitSurface(pTile->tileset,&(pTile->props[numero_tile]),screen,&Rect_dest);
		}
	}
	return 0;
}

void chargerTilesetSDL(FILE* F,Terrain* pTer, TilesetStruct * pTile)
{
	int numtile,i,j;
	char buf[CACHE_SIZE];  /* un buffer, petite mémoire cache*/
	char buf2[CACHE_SIZE];  /* un buffer, petite mémoire cache*/
	fscanf(F,"%s",buf); /* nom du fichier*/
    pTile->tileset=LoadImage32(buf);/* charge le buffer dans le tileset*/
	fscanf(F,"%d %d",&pTer->nbtilesX,&pTer->nbtilesY);/* charge le nombre de tiles en largeur et longueur*/
	pTer->LARGEUR_TILE = pTile->tileset->w/pTer->nbtilesX;/* charge la largeur d'un seul tile ( taille / nbtile)*/
	pTer->HAUTEUR_TILE = pTile->tileset->h/pTer->nbtilesY;/* charge la hauteur d'un seul tile (taille / nbtile)*/
	pTile->props = malloc(pTer->nbtilesX*pTer->nbtilesY*sizeof(SDL_Rect));/*alloue la mémoire pour chaque tile et rentre s il est plein*/
	for(j=0,numtile=0;j<pTer->nbtilesY;j++)
	{
		for(i=0;i<pTer->nbtilesX;i++,numtile++)
		{
			pTile->props[numtile].w = pTer->LARGEUR_TILE;
			pTile->props[numtile].h = pTer->HAUTEUR_TILE;
			pTile->props[numtile].x = i*pTer->LARGEUR_TILE;
			pTile->props[numtile].y = j*pTer->HAUTEUR_TILE;
			fscanf(F,"%s %s",buf,buf2);
			pTer->tileplein[numtile]= 0;
			if (strcmp(buf2,"plein")==0)
				pTer->tileplein[numtile] = 1;/* pour chaques tiles check si c'est plein*/
		}
	}
}



void updateEvents(Input* in)
{
	SDL_Event event;
	while(SDL_PollEvent(&event)) /*SDL_PollEvent teste si event != NULL*/
	{
		switch (event.type)
		{
		case SDL_KEYDOWN:
			in->key[event.key.keysym.sym]=1; /* Met 1 quand une touche est enfoncée*/
			break;
		case SDL_KEYUP:
			in->key[event.key.keysym.sym]=0; /* Met 0 quand une touche est relevée*/
			break;
		default:
			break;
		}
	}
}


void initEvents(Input* in)
{
	memset(in,0,sizeof(Input));
}



void sdlInit(sdlJeu * pSj)
{

    jeuInit(&pSj->Jeu);
    tilesetInit("data/NiveauDépart.txt", &pSj->Jeu.Ter, &pSj->sTile);
    pSj->Jeu.vx=0;
    scoreInit(pSj->Jeu.Score);
	initEvents(&pSj->in);
	pSj->screen = SDL_SetVideoMode(LARGEUR_FENETRE,HAUTEUR_FENETRE,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
    pSj->perso=InitialiserSprite(pSj->perso,150,150,24,30,&pSj->Jeu.Ter);
	pSj->Jeu.Ter.focusSprite=FocusScrollBox(&pSj->Jeu.Ter,pSj->perso,200,150,0,0);
}


void sdljeuBoucle(sdlJeu * pSj)
{
    int jeutermine=0;
    int finboucle=0;
    TTF_Init();
    TTF_Font *Snorlax;
    TTF_Font *Mario;
    SDL_Color Noir={0, 0, 0};
    SDL_Color Rouge= {255, 0, 0};
    Snorlax = TTF_OpenFont("data/LittleSnorlax.ttf", 25);
    Mario = TTF_OpenFont("data/SuperMario256.ttf", 70);
    TTF_SetFontStyle(Mario, TTF_STYLE_NORMAL | TTF_STYLE_BOLD);
    TTF_SetFontStyle(Snorlax,  TTF_STYLE_BOLD);
    char chemin[18];
    while(!(pSj->in).key[SDLK_ESCAPE])
	{
	    while(finboucle==0)
	    {
            while(jeutermine==0)
            {
                updateEvents(&pSj->in);
                jeuEvolue(&pSj->Jeu);
                if (pSj->in.key[SDLK_UP])
                {
                    if((pSj->perso->pPer->posY)>pSj->Jeu.Ter.HAUTEUR_TILE)
                    pSj->Jeu.vy = -2;
                }
                else
                {
                    if((pSj->perso->pPer->posY)<(pSj->Jeu.Ter.nbtiles_hauteur_monde-2)*pSj->Jeu.Ter.HAUTEUR_TILE)
                        pSj->Jeu.vy = 2;
                }
                DeplaceSprite(pSj->perso,pSj->Jeu.vx,pSj->Jeu.vy);
                AfficherMapSDL(&pSj->Jeu.Ter,pSj->screen,pSj->perso,&pSj->sTile);
                AfficherSprite(pSj->perso,pSj->screen);
                AfficherScoreSDL(pSj->Jeu.Ter.xscroll,pSj->screen,Snorlax,Noir);
                if(pSj->Jeu.Ter.xscroll%(200)==0)
                {
                    CopieProchCarte(&pSj->Jeu.Ter, &pSj->Jeu.Tersuiv);
                    if(pSj->Jeu.Ter.xscroll%(1000)==0)
                    {
                        libereTerrain(&pSj->Jeu.Tersuiv);
                        chargerTerrain(&pSj->Jeu.Tersuiv,selectTerrain(chemin),LARGEUR_FENETRE,HAUTEUR_FENETRE);
                    }
                }
                SDL_Flip(pSj->screen);
                SDL_Delay(10);
                jeutermine=persMort(pSj->perso, pSj->Jeu.vx, pSj->Jeu.vy);
            }

            libereTerrain(&pSj->Jeu.Ter);
            libereTerrain(&pSj->Jeu.Tersuiv);
            SDL_Surface * finjeu;
            Terrain cartefin;
            finjeu = SDL_SetVideoMode(LARGEUR_FENETRE/2,HAUTEUR_FENETRE,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
            chargerTerrain(&cartefin,"data/NiveauFin.txt",LARGEUR_FENETRE,HAUTEUR_FENETRE);
            free(pSj->sTile.props);
            tilesetInit("data/NiveauFin.txt",&cartefin, &pSj->sTile);
            AfficherMapSDL(&cartefin,finjeu,pSj->perso,&pSj->sTile);
            MenuFinJeu(finjeu,Mario,Snorlax,Noir,Rouge,pSj->Jeu.Ter.xscroll,pSj,cartefin);
	    }
	}

}

void AfficherScoreSDL(int core,SDL_Surface* screen,TTF_Font *Snorlax,SDL_Color Couleur)
{

    char  score2[50] ;
    sprintf(score2, "Score : %d",core);
    SDL_Surface *score;
    SDL_Rect  posScore;
    score = TTF_RenderText_Blended(Snorlax,score2,Couleur);
    posScore.x = 980;
    posScore.y = 10;
    SDL_BlitSurface(score, NULL,screen, &posScore);
    SDL_FreeSurface(score);

}


void sdlLibere( sdlJeu *pSj)
{
    verifScore(pSj->Jeu.Ter.xscroll,"data/Score.txt");
    LibereSprite(pSj->perso);
	SDL_FreeSurface(pSj->screen);
    SDL_FreeSurface(pSj->sTile.tileset);
	free(pSj->sTile.props);
	SDL_Quit();
}

void MenuFinJeu(SDL_Surface *ecran, TTF_Font *Mario,TTF_Font *Snorlax,
                  SDL_Color Noir, SDL_Color Rouge, int core,sdlJeu * pSj,Terrain cartefin)
{
    char  score2[20];
    SDL_Surface *select = NULL, *titre = NULL, *caption = NULL,*Score = NULL;
    SDL_Rect  posTitre, posCaption, posSelect , posScore;
    SDL_Event instructions;
    sprintf(score2, "Score : %d",core);
    int continuer = 1;
    titre = TTF_RenderText_Blended(Mario, "Fin de partie", Rouge);
    posTitre.x = ecran->w / 2 - titre->w / 2;
    posTitre.y = 10;
    select = TTF_RenderText_Blended(Snorlax, "[ECH] Quitter", Noir);
    posSelect.x = ecran->w / 2 - select->w / 2;
    posSelect.y = 300;
    caption = TTF_RenderText_Blended(Snorlax, "[M] Menu Principal", Noir);
    posCaption.x = ecran->w / 2 - caption->w / 2;
    posCaption.y = 350;
    Score = TTF_RenderText_Blended(Snorlax, score2, Noir);
    posScore.x = ecran->w / 2 - Score->w / 2;
    posScore.y = 200;
    SDL_BlitSurface(titre, NULL, ecran, &posTitre);
    SDL_BlitSurface(Score, NULL, ecran, &posScore);
    SDL_BlitSurface(select, NULL, ecran, &posSelect);
    SDL_BlitSurface(caption, NULL, ecran, &posCaption);
                    SDL_FreeSurface(select);
                SDL_FreeSurface(titre);
                SDL_FreeSurface(caption);
                SDL_FreeSurface(Score);
    SDL_Flip(ecran);
    while (continuer)
    {
        SDL_WaitEvent(&instructions);
        switch(instructions.type)
        {
            case SDL_QUIT:
            continuer = 0;
            exit(EXIT_SUCCESS);
            break;
            case SDL_KEYDOWN:
            switch(instructions.key.keysym.sym)
            {
                case SDLK_m:
                default :
                sdlLibere(pSj);
                libereTerrain(&cartefin);
                TTF_CloseFont(Mario);
                TTF_CloseFont(Snorlax);
                TTF_Quit();
                main(1, "Menu Principal");

                break;
                case SDLK_ESCAPE:
                continuer = 0;
                sdlLibere(pSj);
                libereTerrain(&cartefin);
                TTF_CloseFont(Mario);
                TTF_CloseFont(Snorlax);
                TTF_Quit();
                SDL_Quit();
                exit(EXIT_SUCCESS);
                break;
             }
        }
    }
}

